"""
虽然大模型也依然能够给出一个答案，但是，很显然，他并没有专门“学习”美团的业务知识，自然就无法针对美团的常见问题说明给出比较理想的答案。
那么，如何让大模型能够"学习”美团的业务知识呢?典型的方法有两种:
1.一种方法是微调。就是让大模型回炉进行一次学习，你可以理解为让一个已经毕业的博士，回炉重新学习美团的业务知识。
通常像通义千问、deepseek这样的大模型，经过复杂，庞大的学习过程，已经具备了非常好的理解能力和知识储备这些称为预训练模型。pretraining。
而微调就是在这些预训练型的基础上，再投入少量的资源，让大模型继续学习。大模型"学习“到我们自己收集的数据，从而达到更好的理解能力。
这种方式针对性比较强，对问题的理解也能更精确。但微调的过程，就是让大模型学习到我们自己收集的数据，让是，随之而来的问题是成本还是比较高，而且实现的难度比较大。
如果没有足够的功底，甚至可能让大模型产生倒退。
2.另一种方法就是RAG。Retrival-Augmented Generation 检可能相关的参考信息，然后再把问题跟参考信息一起输索增强生成。
这种方法就是在询问大模型问题时，先检索出跟问题可以理解为我们去向一个专家询问相关业务问题时，带上业务手册入给大模型，让大模型结合参考信息，给出更好的答案。
你这样专家就不用提前学习额外的知识，只需要结合业务手册，就能快速给出针对性的帮助。这种方式成本比较低也更适合处理那些涉及到大量外部数据的特定问题。
因此，RAG也是目前企业用得做多的一种方法。
通常，RAG和模型微调也是可以混合使用的。RAG是给大模型锻炼四肢，而模型微调是给大模型补脑子，两者相辅相
"""
from langchain_community.document_loaders import TextLoader
from langchain_community.document_loaders import DirectoryLoader

from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_redis import RedisConfig, RedisVectorStore

from config.load_key import load_key

# 加载文件
# 1.单文件加载
# loader = TextLoader("./files/2024贝壳北京马拉松暨全国马拉松锦标赛.txt")
# 2.目录加载
loader = DirectoryLoader("./files", glob="**/*.txt", loader_cls=TextLoader, show_progress=True)
documents = loader.load()
print(documents)

# 切分文档  也可以自定义拆分方法
text_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=0, separator="\n", keep_separator=True)

segments = text_splitter.split_documents(documents)
print(len(segments))
for segment in segments:
    print(segment.page_content)
    print("------------")

# 构建向量模型
embedding_model = OpenAIEmbeddings(
    model="Qwen/Qwen3-Embedding-0.6B",
    api_key=load_key("siliconflow_api_key"),
    base_url=load_key("siliconflow_base_url"),
)
# 向量数据持久化
config = RedisConfig(
    index_name="langchain_rag_test_index",
    redis_url=load_key("REDIS_URL"),
)
vector_store = RedisVectorStore(embedding_model, config)
# 向量数据入库
vector_store.add_documents(segments)
